//
//  HMStatusListViewModel.swift
//  WeiBo
//
//  Created by apple on 16/6/26.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
import SDWebImage

/*
    1. 网络请求放在ViewModel
    2. 模型数据
*/

class HMStatusListViewModel: NSObject {

    // 定义一个Viewmodel的单例
    static let shareInstance: HMStatusListViewModel = HMStatusListViewModel()
    
    private override init() {
        
    }
    
    // 定义一个stutusmodel的数组
    lazy var statusList: [HMStatusCellViewModel] = [HMStatusCellViewModel]()
    
    
    // 缓存数据的读取逻辑 -- 先读取数据库数据,如果数据库没有数据,就加载网络
    func loadData(since_id: Int,max_id: Int,success: (count: Int)->(),failed: ()->()){
    
        readDBWeibo(since_id, max_id: max_id) { (array) -> () in
            
            // 我们判断一下有没有微博数据
            if array.count > 0 {
                
                // 进行一下数据转模型
                // 定义一个临时的数组,来接收数据
                var temp = [HMStatusCellViewModel]()
                
                // 进行遍历,然后字典转模型
                for status in array {
                    
                    
                    let model = HMStatusModel(dict: status)
                    

                    
                    // 添加到数组里
                    temp.append(HMStatusCellViewModel(model: model))
                    //                self.statusList.append(HMStatusCellViewModel(model: model))
                    //                self.statusList.append(model)
                }
                
                
                // 判断一下 加载更多的时候,对数组进行拼接
                if max_id > 0 {
                    
                    // 需要对数组进行拼接
                    self.statusList = self.statusList + temp
                    
                } else {
                    
                    self.statusList = temp + self.statusList
                    
                }
                
                // 数据解析之后,进行回调
                success(count: -1)

                
            } else {
                // 没有微博数据,加载网络
                self.netloadData(since_id, max_id: max_id, success: success, failed: failed)
                
            }
            
        }
        
    }
    
    // 添加2个参数,一个since_id 另外一个是 max_id
    func netloadData(since_id: Int,max_id: Int,success: (count: Int)->(),failed: ()->()){
        
        
        guard let access_token = HMOauthViewModel.shareInstance.access_token else {
            return
        }
        // 拼接参数
        /*
        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        */
        // let params: [String : String?]
        // 同学们要多记一些错误
        
        let params = ["access_token":access_token,
                        "since_id": since_id,
                        "max_id": max_id
        ]
        
        
        HMHTTPClient.shareInstance.request(.GET, URLString: "https://api.weibo.com/2/statuses/home_timeline.json", parameters: params, success: { (JSON) -> Void in
            
            
            // 对字典数组进行遍历,然后字典转模型,添加到数组里
            guard let json = JSON as? [String: AnyObject] else {
            
                return
                
            }
            
            // 先要获取到字典数组
            guard   let statuesArray = json["statuses"] as? [[String: AnyObject]] else {
                
                return
            }
            
            
            // 插入数据库数据
            self.dbSaveWeibo(statuesArray)
            
            
            
            let group = dispatch_group_create()
            
            //MARK:-- 以上的2个解包,需要同学们深刻体会一下,swift的安全
            
            // 定义一个临时的数组,来接收数据
            var temp = [HMStatusCellViewModel]()
            
            // 进行遍历,然后字典转模型
            for status in statuesArray {
                
                
                let model = HMStatusModel(dict: status)
                
                // 如果 图片的数组 == 1的时候,我们去下载图片
//                model.pic_urls
//                model.retweeted_status?.pic_urls
                //
                if let urls = model.pic_urls == nil ? model.retweeted_status?.pic_urls : model.pic_urls where urls.count == 1{
                
                    dispatch_group_enter(group)
                    
                    print("单张图片")
//                    print(model.pic_urls)
//                    print(model.retweeted_status?.pic_urls)
                    if let urlString = urls.first?.model?.thumbnail_pic,let url = NSURL(string: urlString) {
                        
                        
                        // 下载图片
                        SDWebImageManager.sharedManager().downloadWithURL(url, options: [], progress: nil, completed: { (_ , _ , _ , _) -> Void in
                            print("图片下载完成")
                            dispatch_group_leave(group)
                        })
                        
                    }
                    
                    
                }
                
                // 添加到数组里
                temp.append(HMStatusCellViewModel(model: model))
//                self.statusList.append(HMStatusCellViewModel(model: model))
//                self.statusList.append(model)
            }
            
            
            // 判断一下 加载更多的时候,对数组进行拼接
            if max_id > 0 {
                
                // 需要对数组进行拼接
                self.statusList = self.statusList + temp
                
            } else {
                
                self.statusList = temp + self.statusList
                
            }
            
            
            
            // 数据解析完成之后,告诉控制器,去刷新数据
            // 应该等到所有的单张图片下载完了,再回调
            dispatch_group_notify(group, dispatch_get_main_queue(), { () -> Void in
                
                // 应该等到所有的单张图片下载完了,再回调
//                success()
                success(count: temp.count)
            })
            
            }) { (error) -> Void in
                print(error)
                
                failed()
        }
        
        
    }
    
    
    // 定义一个数据库保存的方法,来保存微博数据
    private func dbSaveWeibo(array: [[String: AnyObject]]){
        
        // sql语句 
        // sql语句增加一个 replace ,防止 statusid 一样的情况,造成插入失败
        let sql = "INSERT OR REPLACE INTO T_Status (status,statusId,userId) VALUES (?,?,?);"
        
        
        // 获取用户id
        guard let userId = HMOauthViewModel.shareInstance.userModel?.uid else {
            return
        }
        
        
        // 保存微博的话,一条微博一条微博的保存
        for dict in array {
            
            // 存字典,需要把字典转换成二进制 ,再转换成 String
            // 转换成二进制
            guard let data = try? NSJSONSerialization.dataWithJSONObject(dict, options: []) else{
                return
            }
            
            // 把二进制再转换成String
            guard let str = String(data: data, encoding: NSUTF8StringEncoding) else {
                return
            }
            
            // 获取微博id
            if let weiboId = dict["id"] as? Int {
                
                // 就可以插入微博数据
                
                HMDBManager.shareInstance.queue.inTransaction({ (db, rollback) -> Void in
                    
                    if  db.executeUpdate(sql, withArgumentsInArray: [str,weiboId,userId]) {
                        
                        print("插入成功")
                    }
                    
                })
                
            }
            
            
            
        }
        
        
    }
    
    
    // 完成一下数据库的数据读取
    func readDBWeibo(since_id: Int,max_id: Int, closure: (array: [[String: AnyObject]])->() ){
        
        /*
        -- 2. 指定since_id = 3993898059191778
        SELECT status,statusId FROM T_Status WHERE userId =  5829345367 AND 
        statusId > 3993898059191778 ORDER BY statusId DESC ;
        
        -- 3. 指定max_id
        SELECT status,statusId FROM T_Status WHERE userId = 5829345367 AND 
        statusId < 3993898059191778 ORDER BY statusId DESC;

        */
        
        var sql = "SELECT status,statusId FROM T_Status WHERE userId = 5829345367 AND \n"
        // 区分一下,什么时候 指定 statusid > since_id
        //          什么时候 指定 statusid < max_id 
        if max_id > 0 { // 上拉更多 statusid < max_id
            
            sql = sql + "statusId < \(max_id) \n"
            
        } else { // 下拉刷新 statusid > since_id
            
            sql = sql + "statusId > \(since_id) \n"
            
        }
        
        sql = sql + "ORDER BY statusId DESC LIMIT 20 ;"
        
        print(sql)
        
        /*
        SELECT status,statusId FROM T_Status WHERE userId = 5829345367 ANDstatusId < 0ORDER BY statusId DESC;
        */
        // 进行sql语句查询
        HMDBManager.shareInstance.queue.inDatabase { (db) -> Void in
           
            
            let result = db.executeQuery(sql, withArgumentsInArray: nil)
            
            // 定义一个数组,用来接收数据库读取的字典
            var temp: [[String: AnyObject]] = [[String: AnyObject]]()
            
            // 需要对result 进行一下判断,有没有下一个
            while result.next() {
                
                // 读取对应的字段
                let statusString = result.objectForColumnName("status") as? String
                
                // 把字符串转换成字典
                
                // 先把字符串转换成NSData
                
                guard  let data = statusString?.dataUsingEncoding(NSUTF8StringEncoding) else {
                    return
                }
                
            
                
                // 再把data转换成字典
                guard let dict = try? NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String: AnyObject] else{
                    return
                }
                
               
                // 把字典添加到数组里
                temp.append(dict!)
            }
            
            // 当数据拼接完成之后,回调
            closure(array: temp)
            
        }
        
        
        
        
        
    }

    
}

